import { post, get } from '@/utils/request'
export const trigger = `blur`
export const change = `change`
export const baseType = {
  string: `string`,
  number: `number`,
  boolean: `boolean`,
  method: `method`,
  regexp: `regexp`,
  integer: `integer`,
  float: `float`,
  array: `array`,
  object: `object`,
  enum: `enum`,
  date: `date`,
  url: `url`,
  hex: `hex`,
  email: `email`
}
// 规则库
export const baseRules = {
  // 异步重复字段验证 post
  repetition (path, message, id, value, callback) {
    post(path, { value: value, id: id }).then((resp) => {
      if (resp.success && resp.content === false) {
        callback(new Error(`${message}重复`))
      } else {
        callback()
      }
    })
  },
  // 异步重复字段验证 get
  repeated (path, message, id, value, callback) {
    get(path, { value: value, id: id }).then((resp) => {
      if (resp.success && resp.content === false) {
        callback(new Error(`${message}重复`))
      } else {
        callback()
      }
    })
  },
  // 必填 字符串类型
  required (message, type = baseType.string) {
    return { type: type, required: true, message: `请输入${message}`, trigger }
  },
  // 必填  没有类型限制
  require (message) {
    return { required: true, message: `请输入${message}`, trigger }
  },
  // 必填  没有类型限制
  requireClick (message) {
    return { required: true, message: `请上传${message}` }
  },
  // 必填  没有类型限制 选中后验证
  requireChange (message) {
    return { required: true, message: `请选择${message}`, change }
  },
  // 必填  没有类型限制 选中后验证 下拉框多选
  requireSelect (message, type = baseType.array) {
    return { type: type, required: true, message: `请选择${message}`, change }
  },
  // 必填  没有类型限制 选中后验证项目预算
  requireChangeFile (message) {
    return { required: true, message: `请上传${message}`, change }
  },
  // 金额
  money (message = '最大16位（14位整数，2位小数）') {
    return { pattern: /^\d{0,14}(\.\d{1,2})?$/, message: message, trigger }
  },
  // 利率
  interestRate (message = '最大6位（4位整数，2位小数）') {
    return { required: true, pattern: /^\d{0,4}(\.\d{1,2})?$/, message: message, trigger }
  },
  // 邮箱正则
  email (message = '邮箱格式不正确', type = baseType.string) {
    // return { type: type, pattern: /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/, message: message, trigger }
    return { type: type, pattern: /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/, message: message, trigger }// eslint-disable-line
  },
  // 还款间隔日期
  dateTime (message = '长度2位，且必须为大于0的整数') {
    return { required: true, pattern: /^[1-9]{1,2}$/, message: message, trigger }
  },
  // 还款期数
  issue (message = '不能超过360期') {
    return { required: true, pattern: /^([1-9][0-9]?|[1-2][0-9][0-9]|[3][0-5][0-9]|360)$/, message: message, trigger }
  },
  // 只能输入汉字
  chinese (message = '只能输入汉字', type = baseType.string) {
    return { type: type, pattern: /^[\u4e00-\u9fa5]+$/, message: message, trigger }
  },
  // 只能输入整数
  number (message = '只能输入整数') {
    return { pattern: /^\d*$/, message: message, trigger }
  },
  // 只能输入整数大于0
  num (message = '只能输入大于0的整数') {
    return { pattern: /^[1-9]\d*$/, message: message, trigger }
  },
  // 请输入8位正确的发票号码
  num8 (message = '请输入8位正确的发票号码') {
    return { pattern: /^\d{8}$/, message: message, trigger }
  },
  // 可以输入小数
  float (message = '只能输入大于0的数字，最多两位小数') {
    return { pattern: /(^[1-9](\d+)?(\.\d{0,2})?$)|(^\d\.\d{1,2}$)/, message: message, trigger }
  },
  // 可以输入小数 面积用
  floatArea (message = '只能输入大于等于0数字，最多两位小数') {
    return { pattern: /(^[0-9](\d+)?(\.\d{0,2})?$)|(^\d\.\d{1,2}$)/, message: message, trigger }
  },
  // 输入正确的手机号码
  phone (message = '输入正确的手机号码') {
    return { pattern: /^1\d{10}$/, message: message, trigger }
  },
  // 必须包含字母和数字
  letterAndNumber (message = '必须包含字母和数字') {
    return { pattern: /^(?![^a-zA-Z]+$)(?!\D+$)/, message: message, trigger }
  },
  pwd (message = '密码只能[字母+数字,字母+特殊字符，数字+特殊字符]') {
    return { pattern: /^(?=.*[0-9])|((?=[\x21-\x7e]+)[^A-Za-z0-9])|^(?=.*[0-9])((?=[\x21-\x7e]+)[^A-Za-z0-9])$/ig /* 数字及符号 */, message: message, trigger }
  },
  // 长度范围
  range (min, max, type = baseType.string) {
    return { type: type, min: min, max: max, message: `长度在 ${min} 到 ${max}`, trigger }
  }
}
